
// 用 8 个二进制位表示十进制的 -11
// 0b11111101
// 11 -> 00001011
//    -> 11110100
//    -> 11110101 -> -11

// 用 16-bit 表达 -11
// 0b11111111 11110101
// 当表达负数的时候，扩展高位补 1
// 当表达正数的时候，扩展高位补 0

// 8-bit, 表达有符号数的时候: -128 ~ 127
// 能表达的最大正数是？它的二进制是？
// 0b01111111 -> 127
// 能表达的最大负数是？它的二进制是？
// 0b11111111 -1
//
// 能表达的最小负数 -128，0b10000000
// 负数 ----------------------> 正数
// 0b10000000 -> 0b01111111 -> 0b10000000
// -128

// 16-bit 有符号数
// min 二进制：0b1000 0000 0000 0000
// max 二进制：0b0111 1111 1111 1111

// 十六进制数
// 0x33 -> 0b00110011 
// 0x55 -> 0b01010101

// 二进制的按位运算有哪些？
// 按位或运算   ｜
// 按位与运算   &
// 按位异或运算  ^

// 0b1001 | 
// 0b0110
// 0b1111

// 0b1001 &
// 0b0110
// 0b0000

// 0b1001 ^
// 0b0110
// 0b1111

// 二进制移位运算符
// 0b0011 << 1 = 0b0110
// 0b0011 << 2 = 0b1100

// 0b0011 >> 1 = 0b0001
// 0b0011 >> 2 = 0b0000

// 为了在 C++ 里，区分正数和负数，怎么办？
// 定义一个有符号的整数变量
int n = 10; // C++ 中的数字类型，默认是有符号类型
// 定义一个无符号的整数变量
unsigned int m = 10;

// 类型的长度
// 在 C++ 里，哪些类型用于表达整数？
// char  - 1 Byte - 8 bits - 它是计算机中的最小存储单位
// short - 2 Byte - 16 bits
// int   - 4 Byte - 32 bits
// long  - 8 Byte - 64 bits
// long long - 16 Byte - 128 bits

// m short 可以表达的最小负数 + 1
// 0b1000000000000000 = -32768

// x = (x | x << 2) & 0x33
// x    = 0b00000010
//      = 0b00001000
//      = 0b00001010
//        0b00110011 &
//      = 0b00000010
//      = 0b00000100
//      = 0b00000110
//        0b01010101
//      = 0b00000100
// x = (x | x << 1) & 0x55

// y = (y | y << 2) & 0x33
//     = 0b00000100

// z = x | y << 1
// z = 0b00000100 | 0b00001000 = 0b00001100 = 12

// x = 0b00000000 00001111
//   = 0b00000000 01111000

// y = 0b00001111
//   = 0b00000000 11110000

// 2 - 0b00000010 << 1 - 0b00000100 << 1 - 0b00001000
//     4                 8
// 把一个数字每左移一位，相当于把这个数字乘以 2
// 把一个数字每右移一位，相当于把这个数字除以 2
int m = 11;
int n1 = m * 2;
int n2 = m << 1;

// 6 - 0b00000110 << 1 - 0b00001100
